package com.lagou.bigdata.task04;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;

/**
 * 编程实现基于tcp协议的客户端
 */
public class ClientCommunicateTest {

    public static void main(String[] args) {

        Socket socket = null;
        ObjectOutputStream objectOutputStream = null;

        try {
            // 1.创建Socket类型的对象并提供服务器的主机名和端口号
            socket = new Socket("127.0.0.1", 8888);
            objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
            System.out.println("连接服务器成功！");

            // 2.提供字符界面让用户进行业务的选择
            System.out.println("\n\n\t       欢迎进入聊天室");
            System.out.println("-------------------------------------------");
            System.out.print("   [1] 文字聊天");
            System.out.println("         [2] 文件传输");
            System.out.println("   [0] 退出");
            System.out.println("-------------------------------------------");
            System.out.println("请选择具体的业务编号:");
            int choose = ScannerClient.getScanner().nextInt();

            ClientReceiveThread clientReceiveThread = null;
            if (1 == choose) {
                // 3.使用多线程和输入输出流进行通信
                clientReceiveThread = new ClientReceiveThread(socket);
                clientReceiveThread.start();

                // 4.等待子线程终止
                while (true) {
                    // 1.实现客户端发送的内容由用户从键盘输入
                    // 加上睡眠尽量让发送的操作放在接收的后面
                    Thread.sleep(100);
                    System.out.println("请输入要发送的数据内容：");
                    String string = ScannerClient.getScanner().next();
                    objectOutputStream.writeObject(new CommunicationMessage("chat", string));
                    System.out.println("客户端发送成功！");
                    // 当发送的数据内容为"bye"时，则聊天结束
                    if ("bye".equalsIgnoreCase(string)) {
                        System.out.println("聊天结束！");
                        break;
                    }
                }
            }
            // 传输文件的代码省略...
            // 为了代码简单，下面采用了过时的方法结束接收消息的线程
            clientReceiveThread.stop();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (null != objectOutputStream) {
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
